package com.diy.sigmund.diycommon.designpatterns.proxy.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 每次生成动态代理类对象时都需要指定一个实现了InvocationHandler接口的调用处理器对象
 *
 * @author ylm-sigmund
 * @see <a href="https://juejin.cn/post/7011357346018361375#:~:text=JDK%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E6%98%AF,tercept%E3%80%82">JDK动态代理和CGLIB动态代理</a>
 * @since 2022/6/21 22:38
 */
public class ProxyHandler implements InvocationHandler {

    private Object subject; // 这个就是我们要代理的真实对象，也就是真正执行业务逻辑的类

    public ProxyHandler(Object subject) {// 通过构造方法传入这个被代理对象
        this.subject = subject;
    }

    /**
     * 当代理对象调用真实对象的方法时，其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用
     */
    @Override
    public Object invoke(Object obj, Method method, Object[] objs)
            throws Throwable {
        Object result = null;
        System.out.println("可以在调用实际方法前做一些事情");
        System.out.println("当前调用的方法是" + method.getName());
        result = method.invoke(subject, objs);// 需要指定被代理对象和传入参数
        System.out.println(method.getName() + "方法的返回值是" + result);
        System.out.println("可以在调用实际方法后做一些事情");
        System.out.println("------------------------");
        return result;// 返回method方法执行后的返回值
    }
}
